/**
 * 
 */
package co.edu.javeriana.ia.ga.readers;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.LineIterator;

import co.edu.javeriana.ia.ga.Descriptor;
import co.edu.javeriana.ia.ga.Genome;


/**
 * <p>
 * Esta clases permite leer los datos de los genomas en el proceso de clasificacionss
 * </p>
 * 
 * @author <a href=f.triana@javeriana.edu.co">Alejandro Triana</a>
 * @version 1.0
 */
public class GenomeReader {
	
	
	public static final GenomeReader instance;
	
	private List<Genome> genomes;
	
	private int indexNextGenome;
	
	static {
		instance = new GenomeReader();
	}
	
	private GenomeReader() {
		indexNextGenome = 0;
	}
	
	/**
	 * <p>
	 * Retorna el siguiente genoma en la lista
	 * </p>
	 */
	public synchronized Genome nextGenome() {
		
		Genome genome = null;

		if(indexNextGenome >= genomes.size()) {
			indexNextGenome = 0;
		}
		
		genome = getGenomes().get(indexNextGenome);
		indexNextGenome++;
		
		return genome;
	}
	

	/**
	 * <p>
	 * Devuelve la lista de genomas utilizados en la clasificacion
	 * </p>
	 */
	public List<Genome> getGenomes() {
		return genomes;
	}

	public void setGenomes(List<Genome> genomes) {
		this.genomes = genomes;
	}
	
	/**
	 * <p>
	 * Establece la lista de genomas que se utilizaran para el proceso de clasificacion
	 * </p>
	 */
	public void setFlGenomes(File flGenomes, Map<String, Descriptor> descriptors) {
		
		if(flGenomes == null) {
			throw new IllegalArgumentException();
		}
		
		if(genomes == null) {
			genomes = new ArrayList<Genome>();
		} else {
			genomes.clear();
		}
		
		try {
			LineIterator iter = FileUtils.lineIterator(flGenomes);
			int idGenome = 0;
			
			while (iter.hasNext()) {
				
				String genomeName = (String) iter.next();
				Genome genome = new Genome();
				
				genome.setName(genomeName);
				genome.setInternalId(idGenome);
				genome.setDescriptors(descriptors);
				
				idGenome++;
				genomes.add(genome);
			}
			
		} catch (IOException e) {
			throw new RuntimeException("File Genomes doesnt not exist or has a problem");
		}
	}
}
